/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002-2006 * Sleepycat Software. All rights reserved. * * $Id: SecondaryConfig.java,v 1.1 2006/05/06 08:59:30 ckaestne Exp $ */ package com.sleepycat.je; /** * Javadoc for this public class is generated via * the doc templates in the doc_src directory. */ public class SecondaryConfig extends DatabaseConfig { /* * For internal use, to allow null as a valid value for * the config parameter. */ static SecondaryConfig DEFAULT = new SecondaryConfig(); private boolean allowPopulate; private SecondaryKeyCreator keyCreator; private SecondaryMultiKeyCreator multiKeyCreator; private Database foreignKeyDatabase; private ForeignKeyDeleteAction foreignKeyDeleteAction = ForeignKeyDeleteAction.ABORT; private ForeignKeyNullifier foreignKeyNullifier; private ForeignMultiKeyNullifier foreignMultiKeyNullifier; private boolean immutableSecondaryKey; /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public SecondaryConfig() { } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setKeyCreator(SecondaryKeyCreator keyCreator) { this.keyCreator = keyCreator; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public SecondaryKeyCreator getKeyCreator() { return keyCreator; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setMultiKeyCreator(SecondaryMultiKeyCreator multiKeyCreator) { this.multiKeyCreator = multiKeyCreator; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public SecondaryMultiKeyCreator getMultiKeyCreator() { return multiKeyCreator; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setAllowPopulate(boolean allowPopulate) { this.allowPopulate = allowPopulate; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public boolean getAllowPopulate() { return allowPopulate; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setForeignKeyDatabase(Database foreignKeyDatabase) { this.foreignKeyDatabase = foreignKeyDatabase; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public Database getForeignKeyDatabase() { return foreignKeyDatabase; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setForeignKeyDeleteAction(ForeignKeyDeleteAction foreignKeyDeleteAction) { DatabaseUtil.checkForNullParam(foreignKeyDeleteAction, "foreignKeyDeleteAction"); this.foreignKeyDeleteAction = foreignKeyDeleteAction; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public ForeignKeyDeleteAction getForeignKeyDeleteAction() { return foreignKeyDeleteAction; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setForeignKeyNullifier(ForeignKeyNullifier foreignKeyNullifier) { this.foreignKeyNullifier = foreignKeyNullifier; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public ForeignKeyNullifier getForeignKeyNullifier() { return foreignKeyNullifier; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setForeignMultiKeyNullifier(ForeignMultiKeyNullifier foreignMultiKeyNullifier) { this.foreignMultiKeyNullifier = foreignMultiKeyNullifier; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public ForeignMultiKeyNullifier getForeignMultiKeyNullifier() { return foreignMultiKeyNullifier; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public void setImmutableSecondaryKey(boolean immutableSecondaryKey) { this.immutableSecondaryKey = immutableSecondaryKey; } /** * Javadoc for this public method is generated via * the doc templates in the doc_src directory. */ public boolean getImmutableSecondaryKey() { return immutableSecondaryKey; } /* * For JCA Database handle caching. */ void validate(DatabaseConfig configArg) throws DatabaseException { super.validate(configArg); if (configArg == null || !(configArg instanceof SecondaryConfig)) { throw new DatabaseException ("The SecondaryConfig argument is null."); } SecondaryConfig config = (SecondaryConfig) configArg; boolean kcMatch = equalOrBothNull (config.getKeyCreator(), keyCreator); boolean mkcMatch = equalOrBothNull (config.getMultiKeyCreator(), multiKeyCreator); boolean fkdMatch = (config.getForeignKeyDatabase() == foreignKeyDatabase); boolean fkdaMatch = (config.getForeignKeyDeleteAction() == foreignKeyDeleteAction); boolean fknMatch = equalOrBothNull (config.getForeignKeyNullifier(), foreignKeyNullifier); boolean fmknMatch = equalOrBothNull (config.getForeignMultiKeyNullifier(), foreignMultiKeyNullifier); boolean imskMatch = (config.getImmutableSecondaryKey() == immutableSecondaryKey); if (kcMatch && mkcMatch && fkdMatch && fkdaMatch && fknMatch && fmknMatch && imskMatch) { return; } String message = genSecondaryConfigMismatchMessage( config, kcMatch, mkcMatch, fkdMatch, fkdaMatch, fknMatch, fmknMatch, imskMatch); throw new DatabaseException(message); } private boolean equalOrBothNull(Object o1, Object o2) { return (o1 != null) ? o1.equals(o2) : (o2 == null); } String genSecondaryConfigMismatchMessage(DatabaseConfig config, boolean kcMatch, boolean mkcMatch, boolean fkdMatch, boolean fkdaMatch, boolean fknMatch, boolean fmknMatch, boolean imskMatch) { StringBuffer ret = new StringBuffer ("The following SecondaryConfig parameters for the\n" + "cached Database do not match the parameters for the\n" + "requested Database:\n"); if (!kcMatch) { ret.append(" SecondaryKeyCreator\n"); } if (!mkcMatch) { ret.append(" SecondaryMultiKeyCreator\n"); } if (!fkdMatch) { ret.append(" ForeignKeyDelete\n"); } if (!fkdaMatch) { ret.append(" ForeignKeyDeleteAction\n"); } if (!fknMatch) { ret.append(" ForeignKeyNullifier\n"); } if (!fknMatch) { ret.append(" ForeignMultiKeyNullifier\n"); } if (!imskMatch) { ret.append(" ImmutableSecondaryKey\n"); } return ret.toString(); } }